#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
#define EXIT_SUCCES 0

void imprimir_ayuda() {
	char *ayuda = "Usage:\n"
			"\ttp1 -h\n"
			"\ttp1 -V\n"
			"\ttp1 [options] [file...]\n"
			"Options:\n"
			"-V, --version\n\tPrint version and quit.\n"
			"-h, --help\n\tPrint this information and quit.\n"
			"-w, --words\n\tPrint the number of words.\n"
			"-l, --lines\n\tPrint the number of lines.\n"
			"-c, --bytes\n\tPrint the number of bytes.\n";


	printf("%s", ayuda);
}

void count(char c, int *cont_palabra, int *cont_byte, int *count_linea, int *anterior){
	*cont_byte += 1;
	if (c == '\n')
		*count_linea += 1;
	if (*anterior == 0 && (c == ' ' || c == '\n'))
		*cont_palabra += 1;
	if (c == '\n' || c == ' ')
		*anterior = 1;
	else *anterior = 0;
}

void wc (FILE* f_input, int *cont_pal_tot, int *cont_byte_tot, int *cont_linea_tot) {

	int cont_palabra = 0;
	int cont_byte = 0;
	int cont_linea = 0;
	int anterior_fue_espacio_o_newline = 1; //0 si es false, 1 si es true
	char byte = (char)fgetc(f_input);
	while (!feof(f_input)){
		count (byte, &cont_palabra, &cont_byte, &cont_linea, &anterior_fue_espacio_o_newline);
		byte = fgetc(f_input);
	}
	*cont_pal_tot += cont_palabra;
	*cont_byte_tot += cont_byte;
	*cont_linea_tot += cont_linea;
	printf("palabras: %d, bytes: %d, lineas: %d\n", cont_palabra, cont_byte, cont_linea);
}

int main(int argc, char* argv[]) {

	int cont_palabra_total = 0;
	int cont_byte_total = 0;
	int cont_linea_total = 0;
	FILE * f_input;

	// Imprimo la ayuda o la versión
	if ((argc == 2)
			&& ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0))) {
		imprimir_ayuda();
		return 0;
	} else if ((argc == 2)
			&& ((strcmp(argv[1], "-V") == 0)
					|| (strcmp(argv[1], "--version") == 0))) {
		printf("tp1 for 6620-Orga de compus. 1ro C 2014 \n");
		return 0;
	}

	if ((argc == 3)
			&& ((strcmp(argv[1], "-w") == 0))) {
			f_input = fopen(argv[2], "rb");
			wc(f_input, &cont_palabra_total, &cont_byte_total, &cont_linea_total);
			printf("palabras: %d\n", cont_palabra_total);
			return 0;
	}

	if ((argc == 2)
				&& ((strcmp(argv[1], "-w") == 0))) {
				wc(stdin, &cont_palabra_total, &cont_byte_total, &cont_linea_total);
				printf("palabras: %d\n", cont_palabra_total);
				return 0;
	}

	if ((argc == 3)
			&& ((strcmp(argv[1], "-l") == 0))) {
			f_input = fopen(argv[2], "rb");
			wc(f_input, &cont_palabra_total, &cont_byte_total, &cont_linea_total);
			printf("lineas: %d\n", cont_linea_total);
			return 0;
	}

	if ((argc == 2)
			&& ((strcmp(argv[1], "-l") == 0))) {
			wc(stdin, &cont_palabra_total, &cont_byte_total, &cont_linea_total);
			printf("lineas: %d\n", cont_linea_total);
			return 0;
	}

	if ((argc == 3)
			&& ((strcmp(argv[1], "-c") == 0))) {
			f_input = fopen(argv[2], "rb");
			wc(f_input, &cont_palabra_total, &cont_byte_total, &cont_linea_total);
			printf("bytes: %d\n", cont_byte_total);
			return 0;
	}

	if ((argc == 2)
			&& ((strcmp(argv[1], "-c") == 0))) {
			wc(stdin, &cont_palabra_total, &cont_byte_total, &cont_linea_total);
			printf("bytes: %d\n", cont_byte_total);
			return 0;
	}


	int tam = 1;
	if (argc >= 2)
		tam = argc - 1;

	// Lista de los archivos a procesar
	FILE *lista_archivos[tam];

	// Si no hay argumentos considero stdin como el único archivo
	if (argc == 1) {
		lista_archivos[0] = stdin;
		wc(lista_archivos[0], &cont_palabra_total, &cont_byte_total, &cont_linea_total);

	} else {
		int i;
		// Recorro los archivos para abrir y procesarlos
		for (i = 0; i < tam; i++) {

			lista_archivos[i] = fopen(argv[i + 1], "r");

			if (lista_archivos[i] == NULL) {
				fprintf(stderr, "Imposible abrir %s\n", argv[i + 1]);
				return 1;
			}

			wc(lista_archivos[i], &cont_palabra_total, &cont_byte_total, &cont_linea_total);
			fclose(lista_archivos[i]);
		}

		if (tam > 1){

			printf("Total: palabras: %d, bytes: %d, lineas: %d\n", cont_palabra_total, cont_byte_total,cont_linea_total);
		}

	}

	return EXIT_SUCCES;

}








